/**
 * Author(s): xuming.Wong <xuming.Wong@gmail.com>
 */

#include "GameEventManager.h"

namespace PQEngine
{
	GameEventManager::GameEventManager()
	{
		_listenerRun=false;
	}

	GameEventManager& GameEventManager::getSingleton()
	{
		static GameEventManager inst;
		return inst;
	}

	void GameEventManager::addListener(GameEventListener* listener)
	{
		removeNullPlaceHolder();
		if(listener){
			_listeners.push_back(listener);
		}
	}

	void GameEventManager::removeListener(GameEventListener* listener)
	{
		if(_listenerRun){
			int size=_listeners.size();
			for(int i=0;i<size;i++){
				if(listener==_listeners[i]){
					_listeners[i]=NULL;//Null Place Holder for call 
				}
			}
		}else{
			GEventListenerVector::iterator iter = find(_listeners.begin(), _listeners.end(), listener);
			if(iter!=_listeners.end()){
				_listeners.erase(iter);
			}
		}
	}

	void GameEventManager::removeNullPlaceHolder()
	{
		GEventListenerVector::iterator it=_listeners.begin();
		while(_listeners.end()!=it){
			if(*it==NULL){
				it=_listeners.erase(it);
			}else{
				++it;
			}
		}
	}

	void GameEventManager::OnRenderSettingSelected()
	{
		_listenerRun=true;
			for(Ogre::uint i=0;i<_listeners.size();i++){
				if(_listeners[i]){
					_listeners[i]->OnRenderSettingSelected();
				}
			}
			_listenerRun=false;
	}

	void GameEventManager::OnAddComponet(GameObject *obj,Component* componet)
	{
		_listenerRun=true;
		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnAddComponet(obj, componet);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnCreateComponet(GameObject *obj,Component* componet)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnCreateComponet(obj, componet);
			}
		}
		_listenerRun=false;
		
	}

	void GameEventManager::OnAddResource(std::string path,int x,int y)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnAddResource(path, x,y);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnTerrainObjectCreated(TerrainObject* object)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnTerrainObjectCreated(object);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnTerrainObjectSelected(TerrainObject* object)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnTerrainObjectSelected(object);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnTerrainGroupCreated(TerrainGroupObject* object)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnTerrainGroupCreated(object);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnTerrainGroupSelected(TerrainGroupObject* object)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnTerrainGroupSelected(object);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnCreateObject(ObjectType type,int x,int y)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnCreateObject(type, x,y);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnAddChildGameObject(GameObject *parent,GameObject *child)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnAddChildGameObject(parent,child);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnRemoveChildGameObject(GameObject *parent,GameObject *child)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnRemoveChildGameObject(parent,child);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnGameObjectSelected(GameObject *object)
	{
		_listenerRun=true;
		//Bug:when one listener in OnGameObjectSelected function delete other listener cause a BIG bug
		//No reachable :lost a listener call
		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnGameObjectSelected(object);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnTranslateObject(GameObject *object)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnTranslateObject(object);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnRotateObject(GameObject *object)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnRotateObject(object);
			}
		}
		_listenerRun=false;
	}

	void GameEventManager::OnScaleObject(GameObject *object)
	{
		_listenerRun=true;

		for(Ogre::uint i=0;i<_listeners.size();i++){
			if(_listeners[i]){
				_listeners[i]->OnScaleObject(object);
			}
		}
		_listenerRun=false;
	}
}
